use contract_sdk_rust::sim_context;
use contract_sdk_rust::sim_context::SimContext;


// 安装合约时会执行此方法，必须
#[no_mangle]
pub extern "C" fn init_contract() {
    // 安装时的业务逻辑，设置默认值
    sim_context::log("init_contract");
    let ctx = &mut sim_context::get_sim_context();
    // 设置默认键值对
    ctx.put_state("simple_storage", "default", "Hello ChainMaker".as_bytes());
}

// 升级合约时会执行此方法，必须
#[no_mangle]
pub extern "C" fn upgrade() {
    // 升级时的业务逻辑，内容可为空
    sim_context::log("upgrade");
    let ctx = &mut sim_context::get_sim_context();
    ctx.ok("upgrade success".as_bytes());
}

// ============= SimpleStorage 功能实现 =============
// 原有的 Fact 结构体和相关方法已被移除，只保留 SimpleStorage 功能

// set 设置键值对，类似 SimpleStorage.sol 的 set 方法
#[no_mangle]
pub extern "C" fn set() {
    // 获取上下文
    let ctx = &mut sim_context::get_sim_context();

    // 获取传入参数
    let key = ctx.arg_as_utf8_str("key");
    let value = ctx.arg_as_utf8_str("value");

    // 参数校验
    if key.is_empty() {
        let msg = "key cannot be empty";
        ctx.log(msg);
        ctx.error(msg);
        return;
    }

    // 存储键值对
    ctx.put_state("simple_storage", &key, value.as_bytes());

    // 发出事件，类似 SimpleStorage.sol 的 DataStored 事件
    let event_data = vec![key.to_string(), value.to_string()];
    ctx.emit_event("DataStored", &event_data);

    // 记录日志
    let log_msg = format!("Data stored: key={}, value={}", key, value);
    ctx.log(&log_msg);
    
    // 返回成功
    ctx.ok("success".as_bytes());
}

// get 根据键获取值，类似 SimpleStorage.sol 的 get 方法
#[no_mangle]
pub extern "C" fn get() {
    // 获取上下文
    let ctx = &mut sim_context::get_sim_context();

    // 获取传入参数
    let key = ctx.arg_as_utf8_str("key");

    // 参数校验
    if key.is_empty() {
        ctx.log("key cannot be empty");
        ctx.ok("".as_bytes());
        return;
    }

    // 查询数据
    let result = ctx.get_state("simple_storage", &key);
    
    match result {
        Ok(data) => {
            if data.is_empty() {
                // 没有找到数据，返回空字符串
                ctx.log(&format!("No data found for key: {}", key));
                ctx.ok("".as_bytes());
            } else {
                // 找到数据，返回值
                let value = String::from_utf8_lossy(&data);
                ctx.log(&format!("Data retrieved: key={}, value={}", key, value));
                ctx.ok(data.as_slice());
            }
        }
        Err(_) => {
            // 查询失败
            ctx.log(&format!("Failed to get data for key: {}", key));
            ctx.error("get_state failed");
        }
    }
}

// 原有的 save, find_by_file_hash, 和 how_to_use_iterator 方法已被移除